package psc.model.base.transacao;

import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import psc.model.base.basicas.Banco;
import psc.model.base.basicas.IEntity;
import psc.model.base.basicas.TipoLiberacao;
import psc.model.base.cliente.Agencia;
import psc.model.base.cliente.Conta;
import psc.model.base.cliente.Emprestimo;

import util.Constantes;

@Entity
@Table
public class Liberacao implements IEntity {

	public Liberacao() {
		conta = new Conta();
		agencia = new Agencia();
		banco = new Banco();
	}

	@Id
	@GeneratedValue
	private int id;

	@ManyToOne
	@JoinColumn(name = "conta_id", nullable = false)
	private Conta conta;
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "banco_id", nullable = false)
	private Banco banco;
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "agencia_id", nullable = false)
	private Agencia agencia;
	@ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
	@JoinColumn(name = "boleto_id", nullable = true)
	private Boleto boleto;
	@ManyToOne(fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
	@JoinColumn(name = "tipoLiberacao", nullable = false)
	private TipoLiberacao tipoLiberacao;
	@ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
	@JoinColumn(name = "transferencia_id", nullable = true)
	private Transferencia transferencia;
	@ManyToOne
	@JoinColumn(name = "emprestimo_id", nullable = true)
	private Emprestimo emprestimo;

	public Emprestimo getEmprestimo() {
		return emprestimo;
	}

	public void setEmprestimo(Emprestimo emprestimo) {
		this.emprestimo = emprestimo;
	}

	public Transferencia getTransferencia() {
		return transferencia;
	}

	public void setTransferencia(Transferencia transferencia) {
		this.transferencia = transferencia;
	}

	@Temporal(TemporalType.DATE)
	@Column(name = "data_liberacao")
	private Date dataLiberacao;

	@Column(name = "valor")
	private long valor;
	@Column(name = "direcao")
	@Enumerated(EnumType.ORDINAL)
	private Constantes.liberacaoDirecao direcao;

	public Constantes.liberacaoDirecao getDirecao() {
		return direcao;
	}

	public void setDirecao(Constantes.liberacaoDirecao direcao) {
		this.direcao = direcao;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public Conta getConta() {
		return conta;
	}

	public void setConta(Conta conta) {
		this.conta = conta;
	}

	public Banco getBanco() {
		return banco;
	}

	public void setBanco(Banco banco) {
		this.banco = banco;
	}

	public Agencia getAgencia() {
		return agencia;
	}

	public void setAgencia(Agencia agencia) {
		this.agencia = agencia;
	}

	public Boleto getBoleto() {
		return boleto;
	}

	public void setBoleto(Boleto boleto) {
		this.boleto = boleto;
	}

	public TipoLiberacao getTipoLiberacao() {
		return tipoLiberacao;
	}

	public void setTipoLiberacao(TipoLiberacao tipoLiberacao) {
		this.tipoLiberacao = tipoLiberacao;
	}

	public Date getDataLiberacao() {
		return dataLiberacao;
	}

	public void setDataLiberacao(Date dataLiberacao) {
		this.dataLiberacao = dataLiberacao;
	}

	public long getValor() {
		return valor;
	}

	public void setValor(long valor) {
		this.valor = valor;
	}
}
